﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Transactions;
using Dapper;
using IsolationLevel = System.Data.IsolationLevel;

namespace DapperDemo
{
    class Program
    {
        /*
         *
              /// <summary>指定连接的事务锁定行为。</summary>
              public enum IsolationLevel
              {
                /// <summary>正在使用比指定不同的隔离级别，但不能确定其级别。</summary>
                Unspecified = -1,
                /// <summary>无法覆盖从更高隔离级别的事务挂起的更改。</summary>
                Chaos = 16,
                /// <summary>脏读，则意味着发布任何共享的锁，然后利用任何排他锁将生效。</summary>
                ReadUncommitted = 256,
                /// <summary>
                ///   正在读取数据以避免脏读，但在该事务，从而导致不可重复读取或幻像数据末尾之前可以更改数据时，将保持共享的锁。
                /// </summary>
                ReadCommitted = 4096,
                /// <summary>
                ///   在查询中，阻止其他用户更新的数据使用的所有数据上放置锁。
                ///    防止非可重复读取，但幻像行仍有可能。
                /// </summary>
                RepeatableRead = 65536,
                /// <summary>
                ///   范围锁放置在 <see cref="T:System.Data.DataSet" />, ，阻止其他用户更新或将行插入到数据集，直到事务完成。
                /// </summary>
                Serializable = 1048576,
                /// <summary>
                ///   减少阻止通过存储数据的一个应用程序可以读取另一个修改相同的数据的同时版本。
                ///    指示，从一个事务无法查看其他事务中所做的更改即便重新查询。
                /// </summary>
                Snapshot = 16777216,
              }
         *
         */
        //事务隔离 demo
        static void Main(string[] args)
        {
            using (var scope=new TransactionScope(TransactionScopeOption.Required,new TransactionOptions{ IsolationLevel=System.Transactions.IsolationLevel.RepeatableRead,Timeout = new TimeSpan(0,0,0,30)}))
            {
                var sql = "SELECT * FROM dbo.OnLine_Order where  OptNumber='YP201910121652576091' ";
                using (var con = Context.GetConnection())
                {
                    var tran = con.BeginTransaction(IsolationLevel.RepeatableRead);
                    try
                    {
                        var dr = con.ExecuteReader(sql, null, tran);
                        tran.Commit();
                    }
                    catch (Exception e)
                    {
                        Console.WriteLine(e);
                        tran.Rollback();
                    }
                }
            }

            Console.ReadLine();
        }
    }
}
